#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <unistd.h>
#include <cstring>
#include <iostream>

using namespace std;

/*
SIGCHLD 信号
*/

void handler(int signo)
{
    cout << "get a signal: " << signo << endl;
    
    pid_t rid = 0;
    while((rid = waitpid(-1, nullptr, WNOHANG)) > 0) {
        waitpid(-1, nullptr, WNOHANG);
    }
}

int main()
{
    //signal(SIGCHLD, handler);
    signal(SIGCHLD, SIG_IGN);
    //pid_t id = fork();
    for(int i = 0; i < 10; ++i)
    {
        pid_t id = fork();
        if(id == 0)
        {
            int cnt = 5;
            while(cnt--)
            {
                cout << "i am child, pid: " << getpid() << " ,ppid: " << getppid() << endl;
                sleep(1);
            }
            exit(0);
        }
    }
    while(true) {
        cout << "i am father, pid: " << getpid() << endl;
        sleep(1);
    }
    return 0;
}

// void pendingPrint()
// {
//     sigset_t pending;
//     sigemptyset(&pending);
//     sigpending(&pending);
//     for(int i = 31; i >= 1; --i)
//     {
//         if(sigismember(&pending, i)) {
//             cout << '1';
//         }
//         else {
//             cout << '0';
//         }
//     }
//     cout << endl;
// }

// void sighandler(int signo)
// {
//     int cnt = 5;
//     while(cnt--)
//     {
//         pendingPrint();
//         sleep(1);
//     }
//     cout << "get a sig: " << signo << endl;
// }

// int main()
// {
//     struct sigaction act, oact;
//     memset(&act, 0, sizeof(act));
//     memset(&oact, 0, sizeof(oact));
//     act.sa_handler = sighandler;

//     sigset_t mask; sigemptyset(&mask);
//     sigaddset(&mask, 1);
//     sigaddset(&mask, 2);
//     sigaddset(&mask, 3);
//     act.sa_mask = mask;
//     sigaction(2, &act, &oact);
//     while(true)
//     {
//         cout << "i am a process, pid: " << getpid() << endl;
//         pendingPrint();
//         sleep(1);
//     }
//     return 0;
// }